/*
 * Copyright 2011-2023 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0.
 * See `LICENSE` in the project root for license information.
 */

package me.ijleex.platform.framework.util;

/**
 * 文件大小工具类.
 *
 * @author liym
 * @since 2021-08-15 22:21 新建
 */
public abstract class FileSizeUtils {

    private FileSizeUtils() {
    }

    /**
     * 将文件大小转换为可读性格式，支持以1000为换算单位
     *
     * @param bytes 文件大小（Bytes）
     * @param si 是否以1000为换算单位
     * @return 可读性格式文件大小，如 1KB、2MB、3GB……
     */
    // From: https://programming.guide/worlds-most-copied-so-snippet.html
    public static String toHumanReadableFormat(final long bytes, final boolean si) {
        int unitSize = si ? 1000 : 1024;
        long absBytes = bytes == Long.MIN_VALUE ? Long.MAX_VALUE : Math.abs(bytes);
        if (absBytes < unitSize) {
            return bytes + " B";
        }
        int exp = (int) (Math.log(absBytes) / Math.log(unitSize));
        long th = (long) Math.ceil(Math.pow(unitSize, exp) * (unitSize - 0.05));
        if (exp < 6 && absBytes >= th - ((th & 0xFFF) == 0xD00 ? 51 : 0)) {
            exp++;
        }
        String prefixes = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i");
        if (exp > 4) {
            absBytes /= unitSize;
            exp -= 1;
        }
        return String.format("%.1f %sB", absBytes / Math.pow(unitSize, exp), prefixes);
    }

    /**
     * 以1024为换算单位，将文件大小转换为可读性格式
     *
     * @param bytes 文件大小（Bytes）
     * @return 可读性格式文件大小，如 1KB、2MB、3GB……
     */
    public static String toHumanReadableFormat(long bytes) {
        return toHumanReadableFormat(bytes, false);
    }

}
